/**
 * JWT工具类 - 提供JWT令牌的生成和解析功能
 *
 * 开发人员：徐少洋
 * 开发时间：2025-10-20 至 2025-10-25
 * 模块职责：实现JWT令牌的生成、解析和验证，支持用户认证和授权信息传递
 *
 * 技术要点：
 * - HMAC-SHA256签名算法确保令牌安全性
 * - 可配置的令牌过期时间管理
 * - 自定义声明（claims）支持用户信息扩展
 * - 多租户用户信息封装和传递
 * - 异常处理和令牌验证机制
 *
 * 开发故事：负责JWT令牌处理的核心工具类，与认证服务和安全过滤器深度配合，确保系统认证令牌的安全性和可靠性。
 */
package com.pbl.security;

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import io.jsonwebtoken.security.Keys;

import javax.crypto.SecretKey;
import java.util.Date;
import java.util.Map;

public class JwtUtil {
    private final SecretKey key;
    private final long expirationMs;

    /**
     * 构造JWT工具类
     * @param secret 签名密钥（生产环境应从配置获取）
     * @param expirationMs 令牌过期时间（毫秒）
     */
    public JwtUtil(String secret, long expirationMs) {
        this.key = Keys.hmacShaKeyFor(secret.getBytes());
        this.expirationMs = expirationMs;
    }

    /**
     * 生成JWT令牌
     * @param subject 用户标识（通常为用户名或用户ID）
     * @param claims 自定义声明信息
     * @return JWT令牌字符串
     */
    public String generateToken(String subject, Map<String, Object> claims) {
        long now = System.currentTimeMillis();
        return Jwts.builder()
                .setClaims(claims)
                .setSubject(subject)
                .setIssuedAt(new Date(now))
                .setExpiration(new Date(now + expirationMs))
                .signWith(key, SignatureAlgorithm.HS256)
                .compact();
    }

    /**
     * 解析JWT令牌并返回声明信息
     * @param token JWT令牌字符串
     * @return 令牌的声明信息
     * @throws 令牌无效或过期时抛出异常
     */
    public Claims parseClaims(String token) {
        return Jwts.parserBuilder()
                .setSigningKey(key)
                .build()
                .parseClaimsJws(token)
                .getBody();
    }
}
